home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / netlib / stat.c < prev    next >
C/C++ Source or Header  |  1994-03-29  |  2KB  |  113 lines

  1. RCS_ID_C="$Id: stat.c,v 3.1 1994/03/29 12:47:53 ppessi Exp $";
  2. /*
  3.  * stat.c --- stat() for Network Support Library
  4.  *
  5.  * Author: ppessi <Pekka.Pessi@hut.fi>
  6.  *
  7.  * This file is part of the AmiTCP/IP Network Support Library.
  8.  *
  9.  * Copyright © 1993,1994 AmiTCP/IP Group, <amitcp-group@hut.fi>
  10.  *             Helsinki University of Technology, Finland.
  11.  *             All rights reserved.
  12.  *
  13.  * Created      : Sun Mar 27 20:07:40 1994 ppessi
  14.  * Last modified: Tue Mar 29 15:22:20 1994 ppessi
  15.  *
  16.  */
  17.  
  18. #include <sys/types.h>
  19. #include <sys/stat.h>
  20. #include <errno.h>
  21.  
  22. #include <string.h>
  23. #include <stdlib.h>
  24.  
  25. /* DOS 3.0 and MuFS extensions to file info block */
  26. #include "fibex.h"
  27. #include "netlib.h"
  28. #include <proto/dos.h>
  29. #include <proto/utility.h>
  30.  
  31. int stat(const char *name, struct stat *st)
  32. {
  33.   short found;
  34.   register int rc = -1;
  35.   BPTR lock;
  36.  
  37.   if (st == NULL || ((1 & (long)st) == 1)) {
  38.     errno = EFAULT;
  39.     return -1;
  40.   }
  41.  
  42.   lock = Lock(name, SHARED_LOCK);
  43.  
  44.   if (found = lock != NULL) {
  45.     if (Examine(lock, __dostat_fib)) {
  46.       __dostat(__dostat_fib, st);
  47.       st->st_dev = (dev_t)((struct FileLock *)BADDR(lock))->fl_Task;
  48.       rc = 0;
  49.     } else {
  50.       errno = EIO;
  51.     }
  52.   } else {
  53.     UBYTE errcode = IoErr();
  54.     
  55.     if (errcode == ERROR_OBJECT_IN_USE) {
  56.       rc = lstat(name, st);
  57.     } else {
  58.       set_errno(errcode);
  59.     }
  60.   }
  61.  
  62.   if (lock)
  63.     UnLock(lock);
  64.  
  65.   return rc;
  66. }
  67.  
  68. int lstat(const char *name, struct stat *st)
  69. {
  70.   /* Cannot lock - do examine via Examine()/ExNext() */
  71.   int rc = -1;
  72.   char *cname;
  73.  
  74.   if (st == NULL || ((1 & (long)st) == 1)) {
  75.     errno = EFAULT;
  76.     return -1;
  77.   }
  78.  
  79.   cname = malloc(strlen(name) + 1);
  80.  
  81.   if (cname) {
  82.     BPTR lock;
  83.     char *pp = PathPart(strcpy(cname, name));
  84.     *pp = '\0';
  85.  
  86.     if (lock = Lock(cname, SHARED_LOCK)) {
  87.       pp = FilePart(name);
  88.       
  89.       if (Examine(lock, __dostat_fib)) {
  90.     while (ExNext(lock, __dostat_fib)) {
  91.       if (Stricmp(pp, __dostat_fib->fib_FileName) == 0) {
  92.         __dostat(__dostat_fib, st);
  93.         st->st_dev = (dev_t)((struct FileLock *)BADDR(lock))->fl_Task;
  94.         rc = 0;
  95.         break;
  96.       }
  97.     }
  98.       } 
  99.       if (rc != 0)
  100.     errno = ENOENT;
  101.     } else {
  102.       set_errno(IoErr());
  103.     }
  104.  
  105.     free(cname);
  106.   } else {
  107.     errno = ENOMEM;
  108.   }
  109.  
  110.   return rc;
  111. }
  112.  
  113.